package com.ffcs.crmd.tsp.api.netty;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.concurrent.DefaultEventExecutorGroup;

import com.ffcs.crmd.tsp.api.dto.netty.RemotingCommand;
import com.ffcs.crmd.tsp.common.exception.TspRemotingException;

/**
 * 
 * 功能说明:通信客户端接口
 *
 * @author ZHONGFUHUA
 * 
 * @since 1.0.0-SNAPSHOT
 *
 */
public interface INettyRemotingClient {
    
    /**
     * 
     * 功能说明: 关闭通道
     * 
     * @param serverAddr 服务端地址
     * @param channel 通道
     */
    public void closeChannel(String serverAddr, Channel channel);
    
    /**
     * 
     * 功能说明:创建获取通道
     * 
     * @param serverAddr 服务器地址
     * @return 通道
     */
    public Channel getAndCreateChannel(String serverAddr);
    
    /**
     * 功能说明:
     * 
     * @return
     */
    int getClientChannelMaxIdleTimeSeconds();
    
    /**
     * 功能说明:
     * 
     * @return
     */
    DefaultEventExecutorGroup getDefaultEventExecutorGroup();
    
    /**
     * 功能说明:
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     * @param invokeCallback 回调对象
     * @throws TspRemotingException
     */
    public void invokeAsync(String addr, RemotingCommand request) throws TspRemotingException;
    
    /**
     * 功能说明:
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     * @param reponseTimeoutMillis 超时时间
     * @throws TspRemotingException
     */
    public void invokeAsync(String addr, RemotingCommand request, INettyInvokeCallback invokeCallback) throws TspRemotingException;
    
    /**
     * 
     * 功能说明:异步调用
     * 
     * @param addr 访问的服务器地址
     * @param request 请求通信对象
     * @param timeoutMillis 超时时间
     * @param invokeCallback 回调对象
     * @param isNeedScan 是否需要定时扫描清除超时异步调用
     * @throws TspRemotingException
     */
    public void invokeAsync(String addr, RemotingCommand request, INettyInvokeCallback invokeCallback, INettyInvokeCallback sendFailCallback)
        throws TspRemotingException;

    /**
     * 功能说明:
     * 
     * @param addr
     * @param request
     * @param reponseTimeoutMillis
     * @param invokeCallback
     * @param sendFailCallback
     * @throws TspRemotingException
     */
    public void invokeAsync(String addr, RemotingCommand request, long reponseTimeoutMillis, INettyInvokeCallback invokeCallback,
        INettyInvokeCallback sendFailCallback) throws TspRemotingException;

    /**
     * 功能说明:
     * 
     * @param addr
     * @param request
     * @param invokeFailCallback
     * @throws TspRemotingException
     */
    public void invokeOneway(String addr, RemotingCommand request, INettyInvokeCallback invokeFailCallback) throws TspRemotingException;
    
    /**
     * 
     * 功能说明:同步调用
     * 
     * @param addr 访问的服务器地址
     * @param request 请求通信对象
     * @param timeoutMillis 超时时间
     * @return 结果
     * @throws TspRemotingException
     */
    public RemotingCommand invokeSync(String addr, RemotingCommand request, long timeoutMillis)
        throws TspRemotingException;
    
    
    /**
     * 
     * 功能说明:处理远程终端发送过来的命令
     * 
     * @param ctx 上下文
     * @param remotingCommand 远程命令
     */
    public void processMessageReceived(ChannelHandlerContext ctx, RemotingCommand remotingCommand);

    /**
     * 
     * 功能说明: 注册RPC(远程过程调用协议)处理器
     * 
     * @param requestCode 请求代码
     * @param processor 请求处理者
     */
    public INettyRemotingClient registerProcessor(int requestCode, INettyProcessor processor);

    /**
     * 
     * 功能说明:移除缓存中的response
     * 
     * @param opaque 通信体标识
     *
     */
    public void removeResponse(int opaque);

    /**
     * 
     * 功能说明:关闭客户端
     *
     */
    public void shutdown();

    /**
     * 
     * 功能说明:启动客户端
     * 
     */
    public void start();

    
}
